import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as mdates

# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体
plt.rcParams['axes.unicode_minus'] = False    # 解决负号显示问题

def visualize_exchange_rate(csv_file_path, title):
    try:
        # 读取CSV文件
        df = pd.read_csv(csv_file_path)

        # 检查是否有 'date' 和 'exchange_rate' 列
        if 'date' not in df.columns or 'exchange_rate' not in df.columns:
            print(f"文件 {csv_file_path} 缺少 'date' 或 'exchange_rate' 列。")
            return

        # 将 'date' 列转换为 datetime 对象
        df['date'] = pd.to_datetime(df['date'])

        # 按日期排序，以防数据未排序
        df = df.sort_values(by='date')

        # 找出最高点和最低点
        max_rate = df['exchange_rate'].max()
        min_rate = df['exchange_rate'].min()
        date_max_rate = df[df['exchange_rate'] == max_rate]['date'].iloc[0]
        date_min_rate = df[df['exchange_rate'] == min_rate]['date'].iloc[0]

        # 绘图
        plt.figure(figsize=(12, 6))
        plt.plot(df['date'], df['exchange_rate'], label='汇率', color='blue', linewidth=1)

        # 标记最高点
        plt.scatter(date_max_rate, max_rate, color='red', s=100, zorder=5, label=f'最高点: {max_rate:.4f} ({date_max_rate.strftime("%Y-%m-%d")})')
        plt.annotate(f'最高: {max_rate:.4f}', (mdates.date2num(date_max_rate), max_rate), textcoords="offset points", xytext=(0,10), ha='center', color='red')

        # 标记最低点
        plt.scatter(date_min_rate, min_rate, color='green', s=100, zorder=5, label=f'最低点: {min_rate:.4f} ({date_min_rate.strftime("%Y-%m-%d")})')
        plt.annotate(f'最低: {min_rate:.4f}', (mdates.date2num(date_min_rate), min_rate), textcoords="offset points", xytext=(0,-15), ha='center', color='green')

        # 设置图表属性
        plt.title(title, fontsize=16)
        plt.xlabel('日期', fontsize=12)
        plt.ylabel('汇率', fontsize=12)
        plt.legend()
        plt.grid(True)
        plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d'))
        plt.gca().xaxis.set_major_locator(mdates.AutoDateLocator())
        plt.xticks(rotation=45)
        plt.tight_layout()

        # 保存图表
        output_filename = f"{title.replace(' ', '_').lower()}_plot.png"
        plt.savefig(output_filename)
        print(f"图表已保存为: {output_filename}")
        plt.show()

    except FileNotFoundError:
        print(f"错误: 文件 {csv_file_path} 未找到。")
    except Exception as e:
        print(f"处理文件 {csv_file_path} 时发生错误: {e}")

# 定义文件路径
file_eur_cny = r'd:/13langgraph/旧的/eur_cny.csv'
file_eur_usd = r'd:/13langgraph/旧的/eur_usd.csv'
file_usd_cny = r'd:/13langgraph/旧的/usd_cny.csv'

# 可视化每个文件的汇率
visualize_exchange_rate(file_eur_cny, 'EUR to CNY 汇率走势')
visualize_exchange_rate(file_eur_usd, 'EUR to USD 汇率走势')
visualize_exchange_rate(file_usd_cny, 'USD to CNY 汇率走势')

print("所有图表生成完毕。")